热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

03|高性能IO模型:为什么单线程Redis能那么快?

03|高性能IO模型:为什么单线程Redis能那么快?-1.基本概念什么是redis的单线程(核心功能在单线程上,并不是所有功能)redis的网络IO和键值对读写是由一
1.基本概念
  • 什么是redis的单线程(核心功能在单线程上,并不是所有功能)

    • redis的网络IO和键值对读写是由一个线程完成的(redis的核心服务)

    • redis的其他功能由额外线程完成

      • 持久化
      • 异步删除
      • 集群数据同步
2.redis为什么用单线程
  • 多线程的开销

    • 使用多线程可以增加系统吞吐率(每个请求),增加系统扩展性

    • 无限的增加线程数,导致吞吐量下降

      • 被多线程同时访问共享资源,比如共享的数据结构
      • 为了保证线程安全,导致性能的牺牲
      • 粗粒度的锁导致所有串行,系统的吞吐率随着线程的增加而增加
  • 因此为了节省并发资源的管理,redis使用单线程,保证所有操作串行化

\

3.单线程的redis为什么快
  • redis大部分操作都在内存上+高效的数据结构
  • redis采用多路复用机制,在网络中处理大量客户端请求,实现高吞吐率
4.socket
  • socket通信过程(网络IO处理+键值对读写+网络IO处理)

    • SimpleKV 为了处理一个 Get 请求
    • 需要监听客户端请求(bind/listen)
    • 和客户端(代码)建立连接(accept)
    • 从 socket 中读取请求(recv)
    • 解析客户端发送请求(parse)
    • 根据请求类型读取键值数据(get)
    • 最后给客户端返回结果,即向 socket 中写回数据(send)
  • 潜在的阻塞点

    • accept() 未能成功建立连接时,会一直阻塞\

    • recv() 从客户端读取数据时,会一直阻塞\

  • socket的非阻塞模式
  • 保证 Redis 线程,既不会像基本 IO 模型中一直在阻塞点等待,也不会导致 Redis 无法处理实际到达的连接请求或数据
  • Linux 中的 IO 多路复用机制\

5.多路复用
  • Linux中的IO多路复用机制指一个线程处理多个IO流,select/poll

  • 在单线程下,同时存在监听多个套接字和已连接套接字

  • 具体实现

    • FD是多个套接字

    • Redis使用epoll机制,让内核监听套接字

    • Redis可以和多个客户端连接并处理请求,从而提升并发性

    • select/epoll提供了基于事件的回调机制,针对不同的事件调用对应的处理函数

      • 首先将事件放入事件队列,无需润徐请求是否实际发生,避免CPU资源浪费
      • 根据相应的事件执行响应的操作

6.总结
  • redis真的是单线程吗

    • 对网络 IO 和数据读写的操作采用了一个线程\
  • 为什么用单线程

    • 避免多线程开发的并发控制问题
    • 多路复用的 IO 模型密切相关\
  • 单线程为什么这么快

\


推荐阅读
  • 协程作为一种并发设计模式,能有效简化Android平台上的异步代码处理。自Kotlin 1.3版本引入协程以来,这一特性基于其他语言的成熟理念,为开发者提供了新的工具,以增强应用的响应性和效率。 ... [详细]
  • 在Linux系统中使用EncFS实现文件夹加密
    为了保护个人隐私或敏感数据不被未经授权的访问,可以通过加密技术来增强安全性。本文介绍如何在Linux系统上使用EncFS工具创建和管理加密文件夹,以确保即使在系统登录状态下,特定文件夹中的数据也保持加密状态。 ... [详细]
  • 本文探讨了在使用 MyBatis 进行批量数据处理时遇到的参数绑定异常问题,并提供了详细的解决方案。 ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • 本文探讨了在Windows系统中运行Apache服务器时频繁出现崩溃的问题,并提供了多种可能的解决方案和建议。错误日志显示多个子进程因达到最大请求限制而退出。 ... [详细]
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 深入解析Java并发之ArrayBlockingQueue
    本文详细探讨了ArrayBlockingQueue,这是一种基于数组实现的阻塞队列。ArrayBlockingQueue在初始化时需要指定容量,因此它是一个有界的阻塞队列。文章不仅介绍了其基本概念和数据结构,还深入分析了其源码实现,包括各种入队、出队、获取元素和删除元素的方法。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • Java高级工程师学习路径及面试准备指南
    本文基于一位朋友的PDF面试经验整理,涵盖了Java高级工程师所需掌握的核心知识点,包括数据结构与算法、计算机网络、数据库、操作系统等多个方面,并提供了详细的参考资料和学习建议。 ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • WebBenchmark:强大的Web API性能测试工具
    本文介绍了一款名为WebBenchmark的Web API性能测试工具,该工具不仅支持HTTP和HTTPS服务的测试,还提供了丰富的功能来帮助开发者进行高效的性能评估。 ... [详细]
  • 春季职场跃迁指南:如何高效利用金三银四跳槽季
    随着每年的‘金三银四’跳槽高峰期的到来,许多职场人士都开始考虑是否应该寻找新的职业机会。本文将探讨如何制定有效的职业规划、撰写吸引人的简历以及掌握面试技巧,助您在这关键时期成功实现职场跃迁。 ... [详细]
  • flea,frame,db,使用,之 ... [详细]
  • 小米路由器AX6000与小米11同步推出,不仅在硬件配置上达到了旗舰级水准,其独特的4K QAM技术更是引领了行业新标准。本文将深入探讨这款路由器的性能表现及其实际应用。 ... [详细]
author-avatar
亲亲羊to
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有